package LimitedTimeGame.Day_0216;

/**
 * @author zxc
 * @date 2023/02/16 11:04
 **/
/**
 * 题目 ：按照符号重排数组
 * 题目详述 ：
 * 给你一个下标从 0 开始的整数数组 nums ，数组长度为 偶数 ，由数目相等的正整数和负整数组成。
 * 你需要 重排 nums 中的元素，使修改后的数组满足下述条件：
 * 任意连续 的两个整数 符号相反
 * 对于符号相同的所有整数，保留 它们在 nums 中的 顺序 。
 * 重排后数组以正整数开头。
 * 重排元素满足上述条件后，返回修改后的数组。
 *
 * 提示：
 * 2 <= nums.length <= 2 * 105
 * nums.length 是 偶数
 * 1 <= |nums[i]| <= 105
 * nums 由 相等 数量的正整数和负整数组成
 *
 */
public class RearrangeArray02 {
    public static void main(String[] args) {
        System.out.println(rearrangeArray(new int[]{3, 1, -2, -5, 2, -4}));
    }
    /**
     * 思路 ：
     * 即，使用双指针，指针p1在数组nums中顺序指向正整数;指针p2在数组nums中顺序指向负整数;
     * ===>
     * 相比于使用辅助数组来说，降低了空间复杂度，但是为result数组进行赋值过程中，进行双指针，从而提高了时间复杂度;
     * @param nums
     * @return
     */
    public static int[] rearrangeArray(int[] nums) {
        int len = nums.length;
        int[] result = new int[len];
        int p1 = 0;
        int p2 = 0;
        for(int i = 0 ; i < len ; i += 2){
            while(p1 < len && nums[p1] < 0){
                p1++;
            }
            result[i] = nums[p1++];
            while(p2 < len && nums[p2] > 0){
                p2++;
            }
            result[i + 1] = nums[p2++];
        }
        return result;
    }
}
